package com.liu.tools;

import com.liu.tools.conf.ConfigurerEx;

/**
 * @DateTime 2015年3月30日 上午11:44:34
 * @Company 华视传媒
 * @Author 刘兴密
 * @QQ 63972012
 * @Desc ip 过滤工具类
 */
public class IPUtil {

	/**
	 * @DateTime 2015年3月30日 上午11:56:19
	 * @Author 刘兴密
	 * @QQ 63972012
	 * @Desc 检测用户ip是否在指定的ip段中
	 * @param ip 用户ip
	 * @param begip 起始ip
	 * @param endip 结束ip
	 * @return
	 * boolean
	 */
	public static boolean isInIp(String ip, String begip, String endip) {
		
		int[] inip, begipint, endipint;
		inip = getIp(ip);
		begipint = getIp(begip);
		endipint = getIp(endip);
		boolean isIn = false;
		for (int i = 0; i < 4; i++) {
			if (inip[i] >= begipint[i] && inip[i] <= endipint[i]) {
				isIn = true;
			} else {
				isIn = false;
				break;
			}
		}
		return isIn;
	}
	
	/**
	 * @date 2017年5月17日
	 * @time 下午10:37:52
	 * @author liuxingmi
	 * @desc 是否在指定的ip列表中
	 * @param ip
	 * @param ips
	 * @return
	 */
	public static boolean isInIps(String ip, String ips) {
		
		if(StrUtil.isNull(ips)){
			return true;
		}
		
		if (ips.indexOf(ip) != -1) {
			return true;
		}
		
		return false;
	}
	
	
	/**
	 * @DateTime 2015年3月30日 上午11:56:00
	 * @Author 刘兴密
	 * @QQ 63972012
	 * @Desc 把ip转成int数组
	 * @param ip
	 * @return
	 * int[]
	 */
	private static int[] getIp(String ip) {
		String [] values = ip.split("\\.");
		int[] ips = new int [4];
		
		for (int i=0; i<4; i++) {
			ips[i] = Integer.parseInt(values[i]);
		}
		
		return ips;
    }
	
	/**
	 * @DateTime 2015年3月30日 上午11:56:45
	 * @Author 刘兴密
	 * @QQ 63972012
	 * @Desc 判断ip是否在指定的范围内
	 * @param key
	 * @param ip
	 * @return
	 * boolean
	 */
	public static final boolean isInIpRange(String ip, String ipRange) {
	
		if(StrUtil.isNull(ipRange)){
			return true;
		}
		
		String [] ips = ipRange.split("-");
		if (isInIp(ip, ips[0], ips[1])) {
			return true;
		}
		return false;
	}
	
	/**
	 * @DateTime 2015年3月30日 上午11:56:45
	 * @Author 刘兴密
	 * @QQ 63972012
	 * @Desc 判断ip是否在指定的范围内
	 * @param key
	 * @param ip
	 * @return
	 * boolean
	 */
	public static final boolean isIpAllowed(String key, String ip) {
		int i = 1;
		while(true) {
			String singleKey = key + i++;
			if (StrUtil.isNull(ConfigurerEx.getProperty(singleKey))){
				break;
			}
			
			String ipRange = ConfigurerEx.getProperty(singleKey);
			String [] ips = ipRange.split("-");
			if (isInIp(ip, ips[0], ips[1])) {
				return true;
			}
		}
		
		return false;
	}
	
}
